# -*- coding: utf-8 -*-
# @Author: Jerry
# @Date:   2022-02-25 10:44:47
# @Last Modified by:   Jerry
# @Last Modified time: 2022-03-01 15:29:48

# **********
# **********
# OpenCV中的图像处理 » 4_9_5_轮廓分层
# http://www.woshicver.com

# **********
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
import os
rootpath = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
datapath = os.path.join(rootpath,'data')
imgpath = lambda name: os.path.join(datapath,name)

# **********
'''
轮廓分层
目标
-- 学习轮廓的层次，即轮廓中的父子关系。

理论
在前几篇关于轮廓的文章中，我们已经讨论了与OpenCV提供的轮廓相关的几个函数。
但是当我们使用 cv.findcontour()函数在图像中找到轮廓时，我们已经传递了一个参数，轮廓检索模式。
轮廓检索模式通常使用 cv.RETR_LIST 或 cv.RETR_TREE，效果很好。但这到底意味着什么呢?

另外，在输出中，还有一个我们命名为 hierarchy 的输出。但我们从未在任何地方使用过这种层次结构。
那么这个层级是什么?它是用来做什么的?它与前面提到的函数参数有什么关系?
这就是我们在本文中要讨论的内容。

层次结构是什么？
通常我们使用cv.findcontour(8bit单通道图像，检索模式，逼近方法)函数来检测图像中的对象，对吧？有时对象在不同的位置。
但在某些情况下，某些形状在其他形状中。就像嵌套的图形一样。在这种情况下，我们把外部的称为 "父类"，把内部的称为 "子类"。

这样，图像中的轮廓就有了一定的相互关系。我们可以指定一个轮廓是如何相互连接的.
比如，它是另一个轮廓的子轮廓，还是父轮廓等等。这种关系的表示称为"层次结构"。'''

# **********
# 轮廓分层，好比是文件目录结构一样，有了父子并列关系，就出现了一个由此及彼的序列链条关系

# **********
'''OpenCV中的分级表示
所以每个轮廓都有它自己的信息关于它是什么层次，谁是它的孩子，谁是它的父母等等。
OpenCV将它表示为一个包含四个值的数组:[Next, Previous, First_Child, Parent]
    Next表示同一层次的下一个轮廓.
    Previous表示同一层次上的先前轮廓。没有前项时设为-1
    First_Child表示它的第一个子轮廓。
    Parent表示其父轮廓的索引。如果没有子元素或父元素，则该字段被视为-1

    其结构关系如下表示：当前的layer的上一个、下一个、父层、子层，相应位置没有层存在时标记为-1
                    -previous index-
    -parent index-  -current index -  -first_child index-
                    -next index    -


轮廓检索模式
1. RETR_LIST
    这是四个标志中最简单的一个(从解释的角度来看)。它只是检索所有的轮廓，但不创建任何亲子关系。
    在这个规则下，父轮廓和子轮廓是平等的，他们只是轮廓。他们都属于同一层级。

    如果您没有使用任何层次结构特性，那么这是在您的代码中使用的最佳选择。

2. RETR_EXTERNAL
    如果使用此标志，它只返回极端外部标志。所有孩子的轮廓都被留下了。
    可以说，根据这项规则，每个家庭只有长子得到关注。它不关心家庭的其他成员:)。

    如果只想提取外部轮廓，可以使用此标志。
    它在某些情况下可能有用。

3. RETR_CCOMP
    此标志检索所有轮廓并将其排列为2级层次结构。
    物体的外部轮廓(即物体的边界)放在层次结构-1中。
    对象内部孔洞的轮廓(如果有)放在层次结构-2中。
    如果其中有任何对象，则其轮廓仅在层次结构1中重新放置。以及它在层级2中的漏洞等等。

4. RETR_TREE
    它检索所有的轮廓并创建一个完整的家族层次结构列表。
    它甚至告诉，谁是爷爷，父亲，儿子，孙子，甚至更多…:)。
'''












